from django.db import models
from django.contrib.auth.models import User, UserManager
from django import forms
from django.conf import settings

class Usuario(User, models.Model):
    nombreParaJugar = models.CharField(max_length=30)
    objects = UserManager()

    def __unicode__(self):
        return "Usuario: "+self.username+" Nick: "+self.nombreParaJugar

    def desloguearse(self):
    
        # debe preguntar si salir, o si esta en medio de una partida...
        return None


class Mapa(models.Model):
    nombre = models.CharField(max_length=30)
    imagen = models.ImageField(upload_to='mapas')
    usable = models.BooleanField(default=False)
    # falta paises....

    def __unicode__(self):
        return str(self.nombre)


class Pais(models.Model):
    nombre = models.CharField(max_length=30)
    continente = models.CharField(max_length=30)
    coordX = models.IntegerField(max_length=3)
    coordY = models.IntegerField(max_length=3)
    mapaAsoc = models.ForeignKey('Mapa')
    adyacentes = models.ManyToManyField('self', blank=True)

    def __unicode__(self):
        return unicode(self.nombre)


class PaisEnJuego(models.Model):
    cantTropas = models.IntegerField(max_length=3)
    ocupante = models.ForeignKey('Jugador')
    pais = models.ForeignKey('Pais')
    partida = models.ForeignKey('Partida')

    def __unicode__(self):
        nombre = unicode(self.pais.nombre) + ':' + unicode(self.partida.nombre)
        return nombre


class Partida(models.Model):
    nombre = models.CharField(max_length=30)
    estado = models.CharField(max_length=20)
    jugadorActual = models.ForeignKey('Jugador', blank=True, null=True)
    lugaresDisponibles = models.IntegerField(max_length=1) #Queda restringido entre 0-9. Falta acotar mas en otro lado.
    mapa = models.ForeignKey('Mapa')

    def __unicode__(self):
        return unicode(self.nombre)

    def listar_jugadores(self):
        lista_de_jugadores = self.jugador_set.all()
        return lista_de_jugadores
    
    def lugares_disponibles(self):
        return self.lugaresDisponibles

    def iniciar(self):
        import random
        self.estado = "Iniciando"
        # crear los bots
        
        orden = range(1, 7) # no 7... num jugadores en realidad
        random.shuffle(orden)
        i = 1
        jugadores = Jugador.objects.filter(partidaActual=self)
        for j in jugadores:
            j.ordenEnPartida = orden[i]
            i = ((i + 1)  % num_jugadores) +1
            # LOG

        reparto = random.shuffle(range(0, 50))
        random.shuffle(reparto)
        for pais in Pais.object.filter(mapaAsoc=self.mapa):
            ocupante = jugadores.get(ordenEnPartida = i)
            paisEnJuego = PaisEnJuego()
            i = ((i + 1)  % num_jugadores) +1
            if (controlar):
                paisEnJuego.save()

## capaz q deba pasar esto a una vista... o a otro lado

        for jug in jugadores.orderBy(ordenEnPartida):
            jug.setEstado("Activo") # o sin set???
            jug.incorporar(8)
            # LOG
            # bloquear...

        partida.jugar()

### BOCETO ###
    def jugar(self):
        partida.estado = "Activa"
        jugadores = Jugador.objects.filter(partidaActual=self).orderBy(ordenEnPartida)
        i = 1
        
        for jug in jugadores:
            if jug.getEstado("Activo") and "incorporar":
                jug.incorporar(jug.paises_ocupados / 2)
                # LOG

            if jug.getEstado("Activo") and "atacar":
                jug.atacar()
                # LOG

            if jug.getEstado("Activo") and "reagrupar":
                jug.reagrupar()
                # LOG

            if jug.getEstado("Inactivo"):
                jug.esperar()

            self.finalizar_turno()

        i = ((i + 1)  % num_jugadores) +1

class Jugador(models.Model):
    estadoTurno = models.CharField(max_length=20, blank=True) # Activo - Esperando turno
    ordenEnPartida = models.IntegerField(max_length=1, blank=True, null=True) # Entre 1 y 6
    ejercitosDisp = models.IntegerField(max_length=3, blank=True, null=True)
    usuario = models.ForeignKey('Usuario')
    partidaActual = models.ForeignKey('Partida')
    color = models.ForeignKey('Color')

    def __unicode__(self):
        nombre = unicode(self.usuario.nombreParaJugar)
        partida = unicode(self.partidaActual.nombre)
        return nombre + ' @ ' + partida

    def incorporar(self, cantTropas):
        return

    def atacar(self):
        return

    def reagrupar(self):
        return




class Bot(models.Model):
    pass

class Color(models.Model):
    color = models.CharField(max_length=20)

    def __unicode__(self):
        return str(self.color)


